<!DOCTYPE html>
<html lang="en">

  <head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
  </head>

  <body>
    <script>
      /*
            垃圾回收
                把一些已经没有用的数据所占用的内存释放

                方式：
                    引用计数
                        有一个地方使用到，计数+1
                        如果计数不为0，不能回收
        */
      // function f1() {
      //     let a = 10
      // }
      // f1()
      // f1()

      /*
          如果一个数据，还有用，就不能回收
      */
      function f1() {
        let a = 10 // 声明了a这个数据 ，没有在f1中使用，f1中的引用计数为0
        function f2() {
          console.log(a); // 在f2中使用了1次，只要f2存在，计数就是1
        }
        return f2
      }
      // 在这里，使用了一个变量f2引用了 函数f2 ， 函数f2的引用计数是1
      let f2 = f1() // 执行完了 f1 , 本来应该要把 a 回收的，但是发现，f2里面有用到a,不能回收了
      // 占用了内存，一直无法回收 ———— 称为  内存泄漏

      // 如果想要a被回收，首先要让f2的计数为0
      f2 = null // 所变量f2和函数f2之间的关联 消除 , 让函数f2的计数为0了
      // 然后 垃圾回收机制 发现函数f2的计数为0，就会把函数f2回收 ， 函数f2被回收了， a的计数 也为0了 ， a也会被回收
      // 解决了 闭包的 内存泄漏
    </script>
  </body>

</html>